package test;

import java.util.Arrays;
import java.util.List;

import xml.adapter.PosicionAdapter;
import dominio.Bolita;
import dominio.Bolon;
import dominio.Laberinto;
import dominio.LaberintoObject;
import dominio.Nodo;
import dominio.Posicion;
import dominio.Sentido;

public final class HelperLaberintoManual2 {
	
	private final static LaberintoObject VACIO = null;
	private final static LaberintoObject PARED = null;
	private final static Nodo NULL = null;
	private final static int SIZE = 11;
	private final static int HEIGHT = 30;
	private static final String MAPA_POS_INCIAL_PACMAN = "0805";
	private static final String MAPA_POS_INCIAL_FANTASMAS = "0506";
	
	public static Laberinto crearLaberinto(String posIPacman, String posIFantasmas){
		Laberinto laberinto = new Laberinto();
        laberinto.setAlto(SIZE);
        laberinto.setAncho(SIZE);
        laberinto.setNodoAlto(HEIGHT);
        laberinto.setNodoAncho(HEIGHT);
        
        // Armo el laberinto con sus nodos con id pero apuntando todos a null y vacios
        for (int fila = 0; fila < SIZE; fila++) {
            for (int columna = 0; columna < SIZE; columna++) {
            	Posicion posicion = PosicionAdapter.adapt(fila, columna);
            	String id = PosicionAdapter.adapt(posicion);
            	laberinto.addNodo(id, crearNodo(id));
    		}
		}

        // Linkeo cada nodo a su vecino
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
            	Posicion posicion = PosicionAdapter.adapt(i, j);
            	String fila = PosicionAdapter.adapt(i);
            	String columna = PosicionAdapter.adapt(j);
            	String id = PosicionAdapter.adapt(posicion);
            	
            	Nodo arriba = (i == 0) ? NULL : laberinto.getNodo(PosicionAdapter.adapt(i - 1) + columna);
            	Nodo abajo = (i == SIZE - 1) ? NULL : laberinto.getNodo(PosicionAdapter.adapt(i + 1) + columna);
            	Nodo izquierda = (j == 0) ? NULL : laberinto.getNodo(fila + PosicionAdapter.adapt(j - 1));
            	Nodo derecha = (j == SIZE - 1) ? NULL : laberinto.getNodo(fila + PosicionAdapter.adapt(j + 1));
            
            	laberinto.getNodo(id).setArriba(arriba).setAbajo(abajo).setIzquierda(izquierda).setDerecha(derecha);
            }
		}
        
        // Pongo paredes en los bordes(las paredes tienen sus vecinos en null, es decir, deslinkeo vecinos)
        for (int i = 0; i < SIZE; i++) {
        	String p = PosicionAdapter.adapt(i);
			laberinto.getNodo("00" + p).setArriba(NULL).setAbajo(NULL).setIzquierda(NULL).setDerecha(NULL).setContiene(PARED);
			laberinto.getNodo("10" + p).setArriba(NULL).setAbajo(NULL).setIzquierda(NULL).setDerecha(NULL).setContiene(PARED);
			laberinto.getNodo(p + "00").setArriba(NULL).setAbajo(NULL).setIzquierda(NULL).setDerecha(NULL).setContiene(PARED);
			laberinto.getNodo(p + "10").setArriba(NULL).setAbajo(NULL).setIzquierda(NULL).setDerecha(NULL).setContiene(PARED);
		}

        // Defino los portales
        laberinto.getNodo("0500").setArriba(NULL).setAbajo(NULL).setIzquierda(laberinto.getNodo("0510")).setContiene(VACIO);
        laberinto.getNodo("0510").setArriba(NULL).setAbajo(NULL).setDerecha(laberinto.getNodo("0500")).setContiene(VACIO);
        
        // Pongo paredes internas(las paredes tienen sus vecinos en null, es decir, deslinkeo vecinos)
        List<String> paredes = (List<String>)Arrays.asList("0104","0105","0106","0202","0208","0302","0303","0305","0307","0308","0405","0502","0503","0507","0508","0605","0702","0703","0705","0707","0708","0802","0808","0904","0905","0906");
        for (String id : paredes) {
			laberinto.getNodo(id).setArriba(NULL).setAbajo(NULL).setIzquierda(NULL).setDerecha(NULL).setContiene(PARED);
		}
        
     // Pongo pacman y fantasmas pos inicial		
        Nodo nodoInicialFantasmas = laberinto.getNodo(posIFantasmas);		
        Nodo nodoInicialPacman = laberinto.getNodo(posIPacman);		
        laberinto.setNodoInicialFantasmas(nodoInicialFantasmas);		
        laberinto.setNodoInicialPacman(nodoInicialPacman);

        laberinto.getNodo("0505").isPared();
        
        for (Nodo nodo : laberinto.getNodos()) {
        	for (Sentido sentido : Sentido.getTodosLosSentidos()) {
        		if ((nodo.getVecino(sentido) != null) && nodo.getVecino(sentido).isPared()) {
        			nodo.setVecino(sentido, null);
        		}
        	}
        }
        
        return laberinto;
	}		
		
	private static Nodo crearNodo(String id, LaberintoObject contiene, Nodo arriba, Nodo abajo, Nodo izquierda, Nodo derecha) {
		Nodo nodo = new Nodo();
		nodo.setPosicion(getPosFromId(id));
		nodo.setContiene(contiene);
		nodo.setAbajo(abajo);
		nodo.setArriba(arriba);
		nodo.setDerecha(derecha);
		nodo.setIzquierda(izquierda);
		return nodo;
	}

	private static Nodo crearNodo(String id) {
		return crearNodo(id, null, null, null, null, null);
	}
	
	private static Posicion getPosFromId(String id) {
		return PosicionAdapter.adapt(id.substring(0, 2), id.substring(2, 4));
	}
	
	public static void main(String[] args) {
		System.out.println(crearLaberinto(MAPA_POS_INCIAL_PACMAN, MAPA_POS_INCIAL_FANTASMAS));
	}
}
